package casarural;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.*;
import java.util.*;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class ServidorRemotoBD extends UnicastRemoteObject implements InterfazCapaDatos {
    

    private static GestorBD gbd;
    private static String ficheroIPServidorBDRemoto = "ServidorBDRemotoIP.txt";

    
    public ServidorRemotoBD() throws RemoteException {

        gbd = GestorBD.getInstance();
        
    }

    
    public boolean hacerLogin(String usuario, String password) throws RemoteException
    {
        return gbd.autenticar(usuario,password);
    }
    
    

    public Vector seleccionarCasas(String propietario) throws RemoteException
    {
        return gbd.seleccionarCasas(propietario);
    }

    
  
    public int crearOferta (java.sql.Date diaIni, java.sql.Date diaFin, float precio, int numCasa) throws RemoteException
    {   
        return gbd.crearOferta (diaIni, diaFin, precio, numCasa);
    }
    
    

    public Vector seleccionarOfertasReservadas(java.sql.Date diaIni, java.sql.Date diaFin, int numCasa) throws RemoteException
    {
        return gbd.seleccionarOfertasReservadas( diaIni, diaFin, numCasa);
    }
    
    
    
    

    
    
    
    //NI MIRAR-NI MIRAR-NI MIRAR----------------------------------------------------
    
        public Vector seleccionarReservas(java.sql.Date diaIni, java.sql.Date diaFin, int numCasa) throws NoSePuedeReservarException, RemoteException
        {
            return gbd.seleccionarReservas(diaIni,diaFin,numCasa);
        }
    
    
        public Propietario seleccionarPropietario(int numCasa) throws RemoteException
        {
            return gbd.seleccionarPropietario(numCasa);
        }

        public Vector seleccionarCasas() throws RemoteException
        {
            return gbd.seleccionarCasas();
        }

        public Vector seleccionarCasasDorWC(int numDormitorios, int numBanos, java.sql.Date diaIni, java.sql.Date diaFin, float precio, int numMinDias, boolean orden) throws RemoteException
        {   
            return gbd.seleccionarCasasDorWC (numDormitorios, numBanos, diaIni, diaFin, precio, numMinDias, orden);
        }

        public Vector seleccionarOfertas(java.sql.Date diaIni,java.sql.Date diaFin, int numCasa) throws RemoteException
        {
            return gbd.seleccionarOfertas(diaIni,diaFin, numCasa);
        }

        public void transaccionDeReserva(Vector reservasTotales, String numReserva, String numTfnoReserva, float precioTotal) throws RemoteException
        {
            gbd.transaccionDeReserva(reservasTotales, numReserva, numTfnoReserva, precioTotal);
        }
        
        public void transaccionDeOfertas(Vector todasLasOfertasIncluidas, java.sql.Date diaIni, java.sql.Date diaFin, String numOfePrimera, String numOfeUltima, float precio, int numCasa) throws RemoteException
        {
            gbd.transaccionDeOfertas(todasLasOfertasIncluidas,diaIni, diaFin, numOfePrimera,numOfeUltima, precio, numCasa);
        }
        
        public Vector numHabitacionesnumBanos(int numCasa) throws RemoteException
        {
            return gbd.numHabitacionesnumBanos(numCasa);
        }

        public int camas(int numCasa) throws RemoteException
        {
            return gbd.camas(numCasa);
        }
        
        public Vector<Reserva> seleccionarReservas (java.sql.Date diaIni, java.sql.Date diaFin) throws RemoteException
        {
            return gbd.seleccionarReservas(diaIni, diaFin);
        }

        public Vector<Oferta> seleccionarOfertas (String numReserva) throws RemoteException
        {
            return gbd.seleccionarOfertas(numReserva);
        }

        public void anularReserva(String numR, Vector<Oferta> ofertas, Vector<Oferta> ofAnular) throws SQLException, RemoteException
        {
            gbd.anularReserva(numR,ofertas,ofAnular);
        }
    
    
   //--------------------------------------------------------------------- 
    

    
    
    
    
    
    
    
    
    
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.setSecurityManager(new RMISecurityManager());        
        
        try {
            
            BufferedReader br;
            br = new BufferedReader(new FileReader(ficheroIPServidorBDRemoto));
            String IP = br.readLine();
            String numPuerto = br.readLine();
            String nombreServicio = br.readLine();
            br.close();
            
            ServidorRemotoBD servidorBD = new ServidorRemotoBD();
            try { 
                java.rmi.registry.LocateRegistry.createRegistry(Integer.parseInt(numPuerto));
            } catch (Exception e) {
                System.out.println(e.toString()+"\nSe supone que el error se produce porque el rmiregistry ya estaba lanzado");
            }
            String servicio ="//" + IP + ":" + numPuerto + "/" + nombreServicio;               
            Naming.rebind(servicio, servidorBD);
            System.out.println("Servicio lanzado en:\n\t" + servicio);
       
        } catch (FileNotFoundException e) {
            System.out.println("No se ha encontrado fichero con la IP del servidor de datos remoto.");
        } catch (IOException e) {
            System.out.println("Error leyendo el fichero con la IP del servidor de datos remoto.");
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.toString());
        }
        
        
    }

}
